route —— 手动操作路由表
route [-j jail] [-dnqtv] command [[modifiers] args]
modifiers,修饰符
route 实用程序用于手动操作网络路由表。通常不需要它,因为系统路由表管理守护进程(如 routed(8) )应该负责此任务。
route 实用程序支持有限数量的通用选项,但支持丰富的命令语言,使用户能够指定任何可以通过 route(4) 中讨论的编程接口传递的任意请求。
-4
指定 inet 地址系列作为子命令的系列提示。
-6
指定 inet6 地址系列作为子命令的系列提示。
-d
在仅调试(debug-only)模式下运行,即不实际修改路由表。
-n
在报告操作时,绕过以符号方式打印主机名和网络名的尝试。(在符号名和数字等价物之间进行翻译的过程可能相当耗时,可能需要正确操作网络;因此,忘记这一点可能是有利的,特别是在尝试修复网络操作时)。
-t
在仅测试(test-only)模式下运行。使用 /dev/null 代替套接字。
-v
详细(verbose)打印其他详细信息。
-q
禁止 add 、change 、delete 和 flush 命令的所有输出。
-j jail
在jail中运行。
add
添加一个路由
flush
移除所有路由
delete
删除一个指定的路由
del
delete 命令的另一种写法
change
更改路由的各个方面(如网关)
get
查找并显示目的地的路由
monitor
持续报告路由信息库的任何更改、路由查找失败或可疑的网络分区。
show
get 命令的另一种写法
route [-n] monitor [-fib number]
route [-n] flush [family] [-fib number]
如果指定了 flush 命令,则 route 将 “刷新” 所有网关条目的路由表。当地址族可以由任何 -inet6 或 -inet 修饰符指定时,只有具有指定族中地址的目的地的路由才会被删除。此外,-4 或 -6 可以用作 -inet 和 -inet6 修饰符的别名。当指定了 -fib 选项时,该操作将应用于指定的FIB(路由表)。
route [-n] add [-net | -host] destination gateway [netmask] [-fib number]
route [-n] command [-net | -host] destination [gateway [netmask]] [-fib number]
其中 destination 是目标主机或网络,gateway 是下一跳中介,数据包应通过它进行路由。通过解释指定为目的地参数的互联网地址,可以将到特定主机的路由与到网络的路由区分开。可选的修饰符 -net 和 -host 分别强制将目标解释为网络或主机。否则,如果 destination 具有 INADDR_ANY(0.0.0.0) 的“本地地址部分”,或者如果 destination 是网络的符号名称,则假设路由是到网络的;否则,它被假定为到主机的路由。可选地,destination 也可以以 net/bits 格式指定。
例如:
128.32 被解释为 -host 128.0.0.32 128.32.130 被解释为 -host 128.32.0.130 -net 128.32 被解释为 128.32.0.0 -net 128.32.130 被解释为128.32.130.0 192.168.64/20 被解释为 -net 192.168.64 -netmask 255.255.240.0 default 的 destination 是默认路由的同义词。对于IPv4,它是 -net -inet 0.0.0.0 ,对于IPv6,它是 -net -inet6:: 。
如果目的地可以通过不需要中间系统充当网关的接口直接访问,则应指定 -interface 修饰符;给出的网关是该主机在公共网络上的地址,表示用于传输的接口。或者,如果接口是点对点的,则可以给出接口本身的名称,在这种情况下,即使本地或远程地址发生变化,路由仍然有效。
可选的 -netmask 修饰符旨在通过网掩码选项实现OSI ESIS重定向的效果,或手动添加具有与隐含网络接口不同的网掩码的子网路由(否则将使用OSPF或ISIS路由协议进行通信)。一个指定了一个额外的后续地址参数(将被解释为网络掩码)。通过确保此选项遵循目标参数,可以覆盖AF_INET情况下生成的隐式网络掩码。
对于AF_INET6,可以使用 -prefixlen 限定符而不是 -mask 限定符,因为IPv6中不允许使用非连续掩码。例如,-prefixlen 32 指定将使用 ffff:ffff:00000:0000:0000:00000:00000:0000 的网络掩码。默认前缀为64。但是,如果为 destination 指定了 default 前缀,则假定为0。请注意,限定符仅适用于AF_INET6地址族。
路由具有相关的标志,当发送到路由匹配的目的地时,这些标志会影响协议的操作。这些标志可以通过指示以下相应的修饰符来设置(或有时清除):
-xresolve RTF_XRESOLVE
使用时发出消息(用于外部查找)
-iface ~RTF_GATEWAY
目的地可以直接到达
-static RTF_STATIC
手动添加路由
-nostatic ~RTF_STATIC
由内核或守护进程添加的假装(pretend)路由
-reject RTF_REJECT
匹配时发出ICMP不可访问
-blackhole RTF_BLACKHOLE
静默丢弃pkts(在更新期间)
-proto1 RTF_PROTO1
设置特定于协议的路由标志#1
-proto2 RTF_PROTO2
设置特定于协议的路由标志#2
可选的修饰符 -rtt 、-rtvar、-sendpipe、-recvpipe、-mtu、-hopcount、-expire 和 -sthresh 为传输级协议(如TCP或TP4)在路由条目中维护的数量提供初始值。这些可以通过在每个这样的修饰符之前添加 -lock 元修饰符来单独锁定,或者可以指定所有后续的度量都可以由 -lockrest 元修饰符锁定。
请注意,-expire 接受路由的过期时间为自纪元以来的秒数(参见 time(3) )。当数字的第一个字符是“+”或“-”时,它被解释为相对于当前时间的值。
可选修饰符 -fib number 指定该命令将应用于非默认FIB。该 number 必须小于 net.fibs sysctl(8) MIB。当未指定此修饰符或指定负数时,将使用 net.my_fibnum sysctl(8) MIB中显示的默认FIB。
该数字允许通过逗号分隔的列表和/或范围规范进行多个FIB。“-fib 2,4,6”表示FIB编号2、4和6。“-fib 1,3-5,6”表示1、3、4、5和6。
在 change 或 add 命令中,如果目标和网关不足以指定路由(如ISO中多个接口可能具有相同地址的情况),则可以使用 -ifp 或 -ifa 修饰符来确定接口或接口地址。
首先使用 gethostbyname(3) 将为 destination 或 gateway 指定的所有符号名称查找为主机名。如果此查找失败,则使用 getnetbyname(3) 将该名称解释为网络名称。
route 实用程序使用路由套接字和新的消息类型RTM_ADD、RTM_DELETE、RTM_GET和RTM_CHANGE。因此,只有超级用户可以修改路由表。
FreeBSD支持可扩展的多路径路由。默认情况下,它是激活的,但可以通过将 net.route.multipath sysctl(8) MIB设置为0来关闭。
有多种路由查找算法可用。它们可以通过为IPv4设置 net.route.algo.net.algo 和为IPv6设置 net.route.algo.inet6.algo 来配置 sysctl(8) MIB。
可用算法列表可以通过访问以下 sysctl(8) MIB获得:IPv4的 net.route.algo.net.algo_list 和IPv6的 net.rute.algo.inet6.algo_list 。
以下算法可用:
radix
基础系统基数后端。
bsearch
在特殊IP数组中进行无锁二分查找(binary search),专为具有<16条路由的小型FIB量身定制。
此算法仅适用于IPv4。
radix_lockless
无锁不可变基数,在每次可移植更改时重新创建,专为具有<1000条路由的小型FIB量身定制。
dpdk_lpm
DPDK基于DIR24-8的查找,无锁数据结构,针对大型FIB进行了优化。DIR24-8依赖于一个大型平面查找表(IPv4为64 MB),该表由查找键的更重要部分直接索引。为了使用dpdk_lpm算法,必须通过 loader.conf(5) 加载以下一个或两个内核模块:
dxr
仅支持IPv4、无锁、压缩的查找结构(对于大型BGP FIB,每个IPv4前缀低于2.5字节),很容易适应现代CPU缓存层次结构,查找吞吐量随CPU内核呈线性扩展。可在运行时作为内核模块加载或通过 loader.conf(5) 加载:
算法是根据系统路由表的大小自动选择的。它们可以更改,但并非每种算法对每种FIB大小都表现最佳。
route 实用程序在成功时退出0,如果发生错误,则退出>0。
将默认路由添加到网络路由表中。这将把路由表中不可用的目的地的所有数据包发送到192.168.1.1的默认网关:
xxxxxxxxxxroute add -net 0.0.0.0/0 192.168.1.1添加默认路由的简化版本也可以写成:
xxxxxxxxxxroute add default 192.168.1.1通过172.16.1.1网关向172.16.10.0/24网络添加静态路由:
xxxxxxxxxxroute add -net 172.16.10.0/24 172.16.1.1更改路由表中已建立的静态路由的网关:
xxxxxxxxxxroute change -net 172.16.10.0/24 172.16.1.2显示目标网络的路由:
xxxxxxxxxxroute show 172.16.10.0从路由表中删除静态路由:
xxxxxxxxxxroute delete -net 172.16.10.0/24 172.16.1.2从路由表中删除所有路由:
xxxxxxxxxxroute flush路由表可以用 netstat(1) 列出。
add [host | network] %s: gateway %s flags %x正在将指定的路由添加到表中。打印的值来自 ioctl(2) 调用中提供的路由表条目。如果使用的网关地址不是网关的主地址(gethostbyname(3) 返回的第一个地址),则网关地址将以数字和符号形式打印。
xxxxxxxxxxdelete [ host | network ] %s: gateway %s flags %x如上所述,但删除条目时。
%s %s done当指定 flush 命令时,每个被删除的路由表条目都会用这种形式的消息表示。
Network is unreachable尝试添加路由失败,因为列出的网关不在直接连接的网络上。必须给出下一跳网关。
not in table尝试对表中不存在的条目执行删除操作。
routing table overflow尝试了添加操作,但系统资源不足,无法分配内存来创建新条目。
xxxxxxxxxxgateway uses the same route
change 操作导致路由的网关使用与更改的路由相同的路由。下一跳网关应该可以通过不同的路由访问。
xnetstat(1), netintro(4), route(4), loader.conf(5), arp(8), routed(8)
route 实用程序出现在4.2BSD中。